TypeScript 与 Vue 教程
1. Vue.js 简介和特性
Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。它易于上手,同时提供了丰富的功能,如组件化开发、响应式数据绑定、虚拟 DOM 等。Vue.js 的核心库只关注视图层,可以轻松与其他库或现有项目集成。
主要特性:
- 组件化开发:将界面拆分为独立的组件,便于复用和维护。
- 响应式数据绑定:数据与视图自动同步,简化状态管理。
- 虚拟 DOM:高效地更新和渲染 DOM,提升性能。
2. 开发环境搭建
2.1 Vue CLI
Vue CLI 是一个官方提供的脚手架工具,用于快速搭建 Vue 项目。
npm install -g @vue/cli
vue create my-project
cd my-project
npm run serve
2.2 Vite
Vite 是一个新的前端构建工具,由 Vue 作者尤雨溪开发。它提供了极快的冷启动和热更新。
npm init vite@latest my-project --template vue
cd my-project
npm install
npm run dev
3. 创建第一个 Vue 应用
<div id="app">
{{ message }}
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
</script>
4. Vue 实例和生命周期
Vue 实例是 Vue 应用的核心,它包含数据、方法和生命周期钩子。
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
},
created() {
console.log('Vue instance created');
},
mounted() {
console.log('Vue instance mounted');
}
});
5. 模板语法和数据绑定
Vue 使用双大括号 {{ }} 进行文本插值,使用 v-bind 进行属性绑定。
<div id="app">
<p>{{ message }}</p>
<img v-bind:src="imageUrl" alt="Vue logo">
</div>
<script>
new Vue({
el: '#app',
data: {
message: 'Hello Vue!',
imageUrl: 'https://vuejs.org/images/logo.png'
}
});
</script>
6. 组件化开发
组件是 Vue 的核心概念之一,可以将界面拆分为独立的、可复用的组件。
Vue.component('my-component', {
template: '<div>{{ message }}</div>',
data() {
return {
message: 'Hello from component!'
};
}
});
new Vue({
el: '#app'
});
7. 组件通信
7.1 Props
父组件通过 props 向子组件传递数据。
Vue.component('child-component', {
props: ['message'],
template: '<div>{{ message }}</div>'
});
new Vue({
el: '#app',
data: {
parentMessage: 'Hello from parent!'
}
});
7.2 Events
子组件通过 $emit 向父组件发送事件。
Vue.component('child-component', {
template: '<button @click="sendMessage">Send</button>',
methods: {
sendMessage() {
this.$emit('message-sent', 'Hello from child!');
}
}
});
new Vue({
el: '#app',
methods: {
handleMessage(message) {
console.log(message);
}
}
});
7.3 Provide/Inject
用于跨层级组件通信。
new Vue({
el: '#app',
provide: {
message: 'Hello from root!'
}
});
Vue.component('child-component', {
inject: ['message'],
template: '<div>{{ message }}</div>'
});
8. 计算属性和侦听器
8.1 计算属性
计算属性是基于依赖缓存的属性,只有依赖变化时才会重新计算。
new Vue({
el: '#app',
data: {
firstName: 'John',
lastName: 'Doe'
},
computed: {
fullName() {
return `${this.firstName} ${this.lastName}`;
}
}
});
8.2 侦听器
侦听器用于监听数据变化并执行相应操作。
new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
},
watch: {
message(newVal, oldVal) {
console.log(`Message changed from ${oldVal} to ${newVal}`);
}
}
});
9. 条件渲染和列表渲染
9.1 条件渲染
使用 v-if、v-else-if 和 v-else 进行条件渲染。
<div id="app">
<p v-if="showMessage">Message is shown</p>
<p v-else>Message is hidden</p>
</div>
<script>
new Vue({
el: '#app',
data: {
showMessage: true
}
});
</script>
9.2 列表渲染
使用 v-for 进行列表渲染。
<div id="app">
<ul>
<li v-for="item in items" :key="item.id">{{ item.name }}</li>
</ul>
</div>
<script>
new Vue({
el: '#app',
data: {
items: [
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' }
]
}
});
</script>
10. 表单输入绑定
使用 v-model 进行双向数据绑定。
<div id="app">
<input v-model="message" placeholder="Enter message">
<p>{{ message }}</p>
</div>
<script>
new Vue({
el: '#app',
data: {
message: ''
}
});
</script>
11. 单文件组件 (.vue 文件)
单文件组件将模板、脚本和样式封装在一个文件中,便于维护。
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello from SFC!'
};
}
};
</script>
<style scoped>
p {
color: blue;
}
</style>
12. 组件注册 (全局和局部)
12.1 全局注册
Vue.component('my-component', {
template: '<div>Global Component</div>'
});
new Vue({
el: '#app'
});
12.2 局部注册
import MyComponent from './MyComponent.vue';
new Vue({
el: '#app',
components: {
'my-component': MyComponent
}
});
13. Scoped CSS
Scoped CSS 确保样式只作用于当前组件。
<template>
<div class="message">
<p>{{ message }}</p>
</div>
</template>
<style scoped>
.message p {
color: red;
}
</style>
14. CSS 预处理器 (Sass, Less)
使用 Sass 或 Less 编写样式。
<template>
<div class="message">
<p>{{ message }}</p>
</div>
</template>
<style lang="scss" scoped>
$primary-color: blue;
.message p {
color: $primary-color;
}
</style>
15. 动态样式和类绑定
使用 v-bind:class 和 v-bind:style 动态绑定样式和类。
<div id="app">
<div :class="{ active: isActive }" :style="{ color: textColor }">
Dynamic Styling
</div>
</div>
<script>
new Vue({
el: '#app',
data: {
isActive: true,
textColor: 'green'
}
});
</script>
16. Vue Router
Vue Router 是 Vue.js 的官方路由管理器。
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';
Vue.use(VueRouter);
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About }
];
const router = new VueRouter({
routes
});
new Vue({
el: '#app',
router
});
17. Vuex 状态管理
Vuex 是 Vue.js 的官方状态管理库。
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
}
});
new Vue({
el: '#app',
store
});
18. 混入 (Mixins)
混入用于复用组件逻辑。
const myMixin = {
created() {
console.log('Mixin created');
}
};
new Vue({
el: '#app',
mixins: [myMixin]
});
19. 自定义指令
自定义指令用于操作 DOM。
Vue.directive('focus', {
inserted(el) {
el.focus();
}
});
new Vue({
el: '#app'
});
20. 插件系统
插件用于扩展 Vue 功能。
const MyPlugin = {
install(Vue) {
Vue.mixin({
created() {
console.log('Plugin installed');
}
});
}
};
Vue.use(MyPlugin);
new Vue({
el: '#app'
});
21. 虚拟 DOM 和 diff 算法
虚拟 DOM 是 Vue 的核心概念之一,用于高效地更新和渲染 DOM。diff 算法用于比较新旧虚拟 DOM 树,找出需要更新的部分。
22. 异步组件
异步组件用于按需加载组件。
const AsyncComponent = () => import('./AsyncComponent.vue');
new Vue({
el: '#app',
components: {
'async-component': AsyncComponent
}
});
23. keep-alive 组件缓存
<keep-alive> 用于缓存组件实例,避免重复渲染。
<keep-alive>
<component :is="currentComponent"></component>
</keep-alive>
24. 懒加载和代码分割
使用 import() 进行懒加载和代码分割。
const AsyncComponent = () => import('./AsyncComponent.vue');
25. Vue DevTools
Vue DevTools 是 Vue.js 的官方调试工具,用于调试 Vue 应用。
26. Vue Test Utils
Vue Test Utils 是 Vue.js 的官方测试工具库,用于编写单元测试。
27. Vue CLI
Vue CLI 是一个官方提供的脚手架工具,用于快速搭建 Vue 项目。
28. Nuxt.js (Vue.js 服务端渲染框架)
Nuxt.js 是一个基于 Vue.js 的服务端渲染框架,用于构建 SEO 友好的应用。
29. 项目结构组织
良好的项目结构有助于维护和扩展。
my-project/
├── public/
├── src/
│ ├── assets/
│ ├── components/
│ ├── views/
│ ├── store/
│ ├── router/
│ ├── main.js
├── package.json
30. 代码风格和规范
使用 ESLint 和 Prettier 保持代码风格一致。
31. 错误处理和调试技巧
使用 try-catch 和 Vue DevTools 进行错误处理和调试。
32. 性能优化策略
- 使用
v-if替代v-show - 使用
keep-alive缓存组件 - 使用懒加载和代码分割
33. TypeScript 与 Vue
TypeScript 是 JavaScript 的超集,提供了静态类型检查。Vue 3 对 TypeScript 有更好的支持。
33.1 安装 TypeScript
npm install -D typescript
33.2 配置 tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"moduleResolution": "node",
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"]
}
33.3 使用 TypeScript 编写 Vue 组件
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
data() {
return {
message: 'Hello from TypeScript!'
};
}
});
</script>
34. 渲染函数和 JSX
渲染函数用于手动创建虚拟 DOM。
export default {
render(h) {
return h('div', 'Hello from render function');
}
};
35. 服务端渲染 (SSR)
服务端渲染用于提升首屏加载速度和 SEO。
const Vue = require('vue');
const renderer = require('vue-server-renderer').createRenderer();
const app = new Vue({
template: '<div>Hello from SSR</div>'
});
renderer.renderToString(app, (err, html) => {
if (err) throw err;
console.log(html);
});
36. 静态站点生成 (SSG)
静态站点生成用于生成静态 HTML 文件。
37. 待办事项应用
创建一个简单的待办事项应用。
38. 博客系统
创建一个简单的博客系统。
39. 电商网站前端
创建一个简单的电商网站前端。
40. 常用 UI 组件库 (Element UI, Vuetify)
使用 Element UI 或 Vuetify 快速构建 UI。
41. 状态管理替代方案 (Pinia)
Pinia 是一个轻量级的状态管理库,用于替代 Vuex。
42. 社区插件和资源
探索 Vue 社区的插件和资源。
43. 官方文档和学习资源
参考 Vue 官方文档和学习资源。
44. Composition API
Composition API 是 Vue 3